from django import template
from django.http import QueryDict
from urllib.parse import urlencode

register = template.Library()  # 获取实例，然后自定义标签

@register.simple_tag
def search_url(request, **kwargs):
    # 获取查询URL中的查询参数，QueryDict 返回的是字典格式 mutable=True 表示可变化的
    query_params = QueryDict(request.META['QUERY_STRING'], mutable=True)
    for key, value in kwargs.items():
        # 如果参数的值不存在或为空，则忽略，pop进行过滤
        if value is None:
            query_params.pop(key, None)
        else:
            query_params.setlist(key, [value])  # setlist 设置为列表
    # 经过URL编码的URL才能正常使用 doseq=True 可以确保相同键的多个值可以序列化成单个键，可以用逗号进行分割
    return urlencode(query_params, doseq=True)